home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / lboss02.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-14  |  17.5 KB  |  636 lines

  1. /* 2面ボス */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../entry.h"
  11. #include "../sound.h"
  12. #include "../psearch.h"
  13.  
  14.  
  15. #define SPEED_LASER        30
  16.  
  17. #define SPEED_1        3    /* 加速度 */
  18. #define SPEED_1N    28    /* 加速度を足す回数 */
  19.  
  20. #define SPEED_SHOT1    8    /* 1段階目扇型弾速度 */
  21. #define SPEED_SHOT2    10    /* 1段階目弾の速度 */
  22. #define SPEED_SHOT3    12    /* 1段階目・2列直線弾の一番遅い速度 */
  23. #define SPEED_SHOT4    10    /* 第2形態・三角弾の速度 */
  24. #define SPEED_SHOT5    11    /* 第2形態・なぎ倒し弾の速度 */
  25.  
  26.  
  27. #define HP_0    3200        /* 耐久力 */
  28. #define HP_1    HP_0-700    /* 第1形態・耐久力がこれ以下になったら炸裂弾を撃つ */
  29. #define HP_2    HP_1-600    /* 〃   ・耐久力がこれ以下になったら直線弾を撃つ */
  30. #define HP_3    HP_2-500    /* 〃   ・耐久力がこれ以下になったら第2形態へ */
  31.  
  32. #define TIMER_1    2500        /* これ以上時間が経過したら第2形態へ */
  33. #define TIMER_2    7000        /* これ以上時間が経過したら撤退 */
  34. #define TIMER_3    5000        /* これ以上時間が経過したら第2形態攻撃開始 */
  35.  
  36. #define SPEED_3        3    /* 3段階目(撤退)の加速度 */
  37. #define SPEED_3N    32    /* 3段階目の加速度を足す回数 */
  38.  
  39. #define SEQ_DEATH    6
  40.  
  41.  
  42.  
  43. enum {
  44.     MOVETO_INIT = 0,    /* 初期状態 */
  45.     MOVETO_C2L,        /* 中央から左に移動 */
  46.     MOVETO_L2C,
  47.     MOVETO_C2R,
  48.     MOVETO_R2C
  49. };
  50.  
  51. enum {
  52.     ATTACK_UPPER_CORE = 0,    /* 上のコアから攻撃(伸びる弾) */
  53.     ATTACK_LOWER_CORE    /* 下のコアから攻撃(ばらまき弾) */
  54. };
  55.  
  56. static short EnemyMoveLBoss02 (ENEMY *);
  57. static void EnemyTiniLBoss02 (ENEMY *);
  58.  
  59.  
  60. void EnemyInitLBoss02 (ENEMY * p)
  61. {
  62.     p->vx = 0;
  63.     p->vy = 4 << 16;
  64.  
  65.     /* 第1形態の当り判定 */
  66.     p->hit_px = 32;
  67.     p->hit_py = 16;
  68.     p->hit_sx = 32;
  69.     p->hit_sy = 16;
  70.     p->hit_cx = 6;
  71.     p->timer = 0;
  72.     p->damage = 0;
  73.     p->flash = 0;
  74.     p->hp = HP_0;
  75.     p->pt = obj_lboss02;
  76.     p->core_pt = sp_core01;
  77.     p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS_CORE;
  78.     p->seq = 0;
  79.     p->func_enemy_move = EnemyMoveLBoss02;
  80.     p->func_enemy_tini = EnemyTiniLBoss02;
  81.  
  82.     p->parts1 = 0;
  83.     p->parts2 = 0;
  84.     p->parts1_work = 20;    /* 左翼復活までの時間( =1 で復活) */
  85.     p->parts1_work2 = 0;    /* 左翼何回復活したか */
  86.     p->parts2_work = 50;    /* 右翼復活までの時間( =1 で復活) */
  87.     p->parts2_work2 = 0;    /* 右翼何回復活したか */
  88.  
  89.     p->parts3 = 0;
  90.     p->parts4 = 0;
  91.     p->parts3_work = 0;    /* 耳が出たか */
  92.     p->parts3_work2 = 0;    /* 翼破壊から耳発生までの時間 */
  93.  
  94.     entry_counter_stop = !0;/* エントリーカウンター停止 */
  95.  
  96.     if (p->arg == 0)
  97.         p->work4 = PALET_LBOSS02 | PRIORITY_BOSS;
  98.     else
  99.         p->work4 = PALET_LBOSS02_1 | PRIORITY_BOSS;
  100. }
  101.  
  102.  
  103.  
  104. static short EnemyMoveLBoss02 (ENEMY * p)
  105. {
  106.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  107.     p->x = (p->lx += p->vx) >> 16;
  108.     p->y = (p->ly += p->vy) >> 16;
  109.     p->timer++;
  110.  
  111.     switch (p->seq) {
  112.     case 0:
  113.         if (SHORT_LY > 48)
  114.             p->seq++;
  115.         break;
  116.     case 1:        /* 減速 */
  117.         p->vy -= 8192;
  118.         if (p->vy < 8192) {
  119.             p->seq++;
  120.             p->vy = 0;
  121.             p->m_work = MOVETO_INIT;    /* 移動方向 */
  122.             p->m_work3 = 0;    /* 第1段階の中での攻撃方法 */
  123.             p->s_work = 0;
  124.             p->s_work3 = 0;    /* 直線弾用 */
  125.         }
  126.         break;
  127.  
  128.         /* 第1形態 */
  129.     case 2:        /* 左右に移動しつつ扇状弾 */
  130.         /* まず移動処理 */
  131.         if (p->m_work == MOVETO_INIT) {
  132.             /* 初期状態なら */
  133.             if (p->x > player->x)
  134.                 p->m_work = MOVETO_C2L;    /* 移動方向 */
  135.             else
  136.                 p->m_work = MOVETO_C2R;    /* 移動方向 */
  137.             p->m_work2 = 0;
  138.         }
  139.         if (p->m_work2 == 0) {
  140.             /* 初回なら */
  141.             signed short dx, dy;
  142.             signed short dx_table[5] =
  143.             {0, 54 + 16, 128 + 16, 256 - 54 + 16, 128 + 16};
  144.             short m_work_table[5] =
  145.             {MOVETO_INIT, MOVETO_L2C, MOVETO_C2R, MOVETO_R2C, MOVETO_C2L};
  146.  
  147.             p->m_work2 = !0;
  148.             /* 順に左→中央→右→中央→左へ移動 */
  149.             dx = dx_table[p->m_work];
  150.             p->m_work = m_work_table[p->m_work];
  151.  
  152.             /* player->y は乱数の種として使用しています */
  153.             if (SHORT_LY < 80)
  154.                 dy = (((unsigned short) rndtable[(player->y) & 0xff]) / 4 + 32 + 16);
  155.             else
  156.                 dy = 64;
  157.             /* 移動方向を設定 */
  158.             SubEnemyMoveToInit (p, dx, dy, SPEED_1, SPEED_1N);
  159.         } else {
  160.             /* 設定値に従って移動 */
  161.             if (SubEnemyMoveTo (p) < 0)
  162.                 p->m_work2 = 0;    /* 移動方向再設定 */
  163.         }
  164.  
  165.         /* 次に攻撃処理 */
  166.         if (p->s_work++ > 100)
  167.             p->s_work = 0;
  168.  
  169.         switch (p->m_work3) {
  170.         case 0:
  171.             if (p->hp < HP_1) {
  172.                 p->m_work3++;
  173.                 EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  174.                 SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  175.             }
  176.             break;
  177.         case 1:
  178.             if (p->hp < HP_2) {
  179.                 p->m_work3++;
  180.                 EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  181.                 SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  182.             }
  183.             break;
  184.         case 2:
  185.             if (p->hp < HP_3) {
  186.                 p->m_work3++;
  187.                 EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  188.                 SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  189.             }
  190.             break;
  191.         default:
  192.             break;
  193.         }
  194.         if (p->timer > TIMER_1)
  195.             p->m_work3 = 4;
  196.  
  197.         switch (p->m_work3) {
  198.             /* case の並び方に注目 */
  199.         case 2:    /* 2列直線弾 */
  200.             switch (p->s_work3++) {
  201.             case 0:
  202.                 p->s_angle3 = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  203.                 p->s_work4 = SPEED_SHOT3;
  204.                 break;
  205.             case 20 + 6 * 0:
  206.             case 20 + 6 * 1:
  207.             case 20 + 6 * 2:
  208.             case 20 + 6 * 3:
  209.             case 20 + 6 * 4:
  210.             case 20 + 6 * 5:
  211.                 EshotInit (ESHOT_NRG32, SHORT_LX, SHORT_LY + 8, p->s_work4, p->s_angle3, 3);
  212.                 SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  213.                 p->s_work4 += 3;
  214.                 break;
  215.             case 20 + 6 * 11:
  216.                 p->s_work3 = 0;
  217.                 break;
  218.             default:
  219.                 break;
  220.             }
  221.             /* ここに break が無いことに注意 */
  222.         case 1:    /* 炸裂弾 */
  223.             if (p->s_work == 25) {
  224.                 EshotInit (ESHOT_NRG04, SHORT_LX, SHORT_LY + 8, SPEED_SHOT2, 16 + 32 * 0, 3);
  225.                 EshotInit (ESHOT_NRG04, SHORT_LX, SHORT_LY + 8, SPEED_SHOT2, 16 + 32 * 1, 3);
  226.                 EshotInit (ESHOT_NRG04, SHORT_LX, SHORT_LY + 8, SPEED_SHOT2, 16 + 32 * 2, 3);
  227.                 EshotInit (ESHOT_NRG04, SHORT_LX, SHORT_LY + 8, SPEED_SHOT2, 16 + 32 * 3, 3);
  228.                 EshotInit (ESHOT_NRG04, SHORT_LX, SHORT_LY + 8, SPEED_SHOT2, 16 + 32 * 4, 3);
  229.                 EshotInit (ESHOT_NRG04, SHORT_LX, SHORT_LY + 8, SPEED_SHOT2, 16 + 32 * 5, 3);
  230.                 EshotInit (ESHOT_NRG04, SHORT_LX, SHORT_LY + 8, SPEED_SHOT2, 16 + 32 * 6, 3);
  231.                 EshotInit (ESHOT_NRG04, SHORT_LX, SHORT_LY + 8, SPEED_SHOT2, 16 + 32 * 7, 3);
  232.                 EshotInit (ESHOT_NRG04, SHORT_LX, SHORT_LY + 8, SPEED_SHOT2, 16 + 32 * 8, 3);
  233.                 SoundSetSE (SE_EBOMB_M);    /* 敵炸裂弾音 */
  234.             }
  235.             if ((p->s_work == 76) && (p->y + 128 > player->y)) {
  236.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 8, SPEED_SHOT3, 32 * 0, 3);
  237.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 8, SPEED_SHOT3, 32 * 1, 3);
  238.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 8, SPEED_SHOT3, 32 * 2, 3);
  239.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 8, SPEED_SHOT3, 32 * 3, 3);
  240.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 8, SPEED_SHOT3, 32 * 4, 3);
  241.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 8, SPEED_SHOT3, 32 * 5, 3);
  242.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 8, SPEED_SHOT3, 32 * 6, 3);
  243.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 8, SPEED_SHOT3, 32 * 7, 3);
  244.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 8, SPEED_SHOT3, 32 * 8, 3);
  245.                 SoundSetSE (SE_EBOMB_M);    /* 敵炸裂弾音 */
  246.             }
  247.             /* ここに break が無いことに注意 */
  248.         case 0:    /* なぎ倒し弾 */
  249.             if (p->s_work == 1) {
  250.                 p->s_angle = 16;
  251.                 p->s_angle2 = 128 - 16;
  252.                 p->s_work2 = 0;
  253.             }
  254.             if ((p->s_work > 6) && (p->s_work < 60)) {
  255.                 p->s_work2++;
  256.                 if (p->s_work2 > 3) {
  257.                     p->s_work2 = 0;
  258.                     EshotInit (ESHOT_NRG02, SHORT_LX - 29, SHORT_LY - 23, SPEED_SHOT1, p->s_angle, 0);
  259.                     EshotInit (ESHOT_NRG02, SHORT_LX + 29, SHORT_LY - 23, SPEED_SHOT1, p->s_angle2, 0);
  260.                     p->s_angle += 6;
  261.                     p->s_angle2 -= 6;
  262.                     SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  263.                 }
  264.             }
  265.             break;
  266.         case 3:    /* 頭部を破壊した */
  267.         case 4:    /* 頭部を破棄した */
  268.             {
  269.                 short arg;
  270.                 if (p->m_work3 == 3)
  271.                     arg = 0;
  272.                 else
  273.                     arg = 1;
  274.                 if (p->arg)
  275.                     arg += 2;
  276.                 EnemyInit (ENEMY_LBOSS02H, SHORT_LX, SHORT_LY, arg, 0);    /* 頭を分離 */
  277.             }
  278.             if (!eshot_erase)
  279.                 eshot_erase = ESHOT_ERASE;    /* 弾消し */
  280.             p->pt = obj_lboss02 + 2;    /* 本体部分だけになる */
  281.             p->seq++;
  282.             p->m_work = 0;
  283.             p->m_work2 = 0;
  284.             p->hit_px = p->hit_py = p->hit_sx = p->hit_sy = p->hit_cx = 0;
  285.             break;
  286.         }
  287.         break;
  288.  
  289.  
  290.     case 3:        /* 合体! */
  291.         switch (p->m_work) {
  292.         case 0:
  293.             if (SubEnemyMoveTo (p) < 0) {    /* 止まるまで待つ */
  294.                 p->m_work++;
  295.                 /* 移動方向を設定 */
  296.                 SubEnemyMoveToInit (p, 128 + 16, 128, SPEED_1, SPEED_1N);
  297.             }
  298.             break;
  299.         case 1:
  300.             if (SubEnemyMoveTo (p) < 0)    /* 止まるまで待つ */
  301.                 p->m_work++;
  302.             break;
  303.         case 2:
  304.             if (p->m_work2 == 43)
  305.                 SoundSetSE (SE_LOCK_M);    /* 「がちゃん」という効果音を鳴らす */
  306.             if (p->m_work2 == 53) {
  307.                 p->pt = obj_lboss02 + 4;    /* 本体+大パーツを本体とする */
  308.                 p->seq++;
  309.                 p->cwork = ATTACK_UPPER_CORE;
  310.                 p->m_work = MOVETO_INIT;    /* 移動方向 */
  311.                 p->s_work = 0;
  312.                 p->s_work2 = 0;
  313.                 p->s_work3 = -110;
  314.                 p->s_angle3 = 0;
  315.  
  316.                 /* 第2形態の当り判定 */
  317.                 p->hit_px = 64;
  318.                 p->hit_py = 16;
  319.                 p->hit_sx = 64;
  320.                 p->hit_sy = 16;
  321.                 p->hit_cx = 16;
  322.             }
  323.             /* 大パーツ部の処理 */
  324.             if (p->m_work2 < 53) {
  325.                 signed short offset_y[53] =    /* 大パーツの座標オフセット */
  326.                 {
  327.                     185, 179, 172, 166, 159, 153, 147, 140, 134, 127,
  328.                     121, 115, 108, 102, 95, 89, 83, 76, 70, 63,
  329.                     57, 51, 44, 38, 31, 26, 21, 17, 14, 11,
  330.                     10, 9, 8, 7, 7, 6, 5, 4, 3, 3,
  331.                     2, 1, 0, -1, -1, 0, 1, 0, -1, -1,
  332.                     0, 1, 0
  333.                 };
  334.                 if (p->arg == 0)
  335.                     xobj_set (SHORT_LX, SHORT_LY + offset_y[p->m_work2],
  336.                           obj_lboss02 + 3, PALET_LBOSS02 | PRIORITY_BOSS_PARTS_L);
  337.                 else
  338.                     xobj_set (SHORT_LX, SHORT_LY + offset_y[p->m_work2],
  339.                           obj_lboss02 + 3, PALET_LBOSS02_1 | PRIORITY_BOSS_PARTS_L);
  340.                 xsp_set (SHORT_LX - 16, SHORT_LY + offset_y[p->m_work2] - 16,
  341.                      sp_core01, PALET_CORE_BLUE | PRIORITY_BOSS_CORE);
  342.                 xsp_set (SHORT_LX, SHORT_LY + offset_y[p->m_work2] - 16,
  343.                      sp_core01, PALET_CORE_BLUE | PRIORITY_BOSS_CORE);
  344.             }
  345.             p->m_work2++;
  346.             break;
  347.         }
  348.         break;
  349.  
  350.  
  351.         /* 第2形態 */
  352.     case 4:
  353.         if (p->timer > TIMER_2) {
  354.             p->seq++;    /* 時間切れ */
  355.             p->m_work = 0;
  356.             break;
  357.         }
  358.         /* まず移動処理 */
  359.         if (p->m_work == MOVETO_INIT) {
  360.             /* 初期状態なら */
  361.             if (p->x > player->x)
  362.                 p->m_work = MOVETO_C2L;    /* 移動方向 */
  363.             else
  364.                 p->m_work = MOVETO_C2R;    /* 移動方向 */
  365.             p->m_work2 = 0;
  366.         }
  367.         if (p->m_work2 == 0) {
  368.             /* 初回なら */
  369.             signed short dx, dy;
  370.             signed short dx_table[5] =
  371.             {0, 72 + 16, 128 + 16, 256 - 72 + 16, 128 + 16};
  372.             short m_work_table[5] =
  373.             {MOVETO_INIT, MOVETO_L2C, MOVETO_C2R, MOVETO_R2C, MOVETO_C2L};
  374.  
  375.             p->m_work2 = !0;
  376.             /* 順に左→中央→右→中央→左へ移動 */
  377.             dx = dx_table[p->m_work];
  378.             p->m_work = m_work_table[p->m_work];
  379.  
  380.             /* player->y は乱数の種として使用しています */
  381.             if (SHORT_LY < 80)
  382.                 dy = (((unsigned short) rndtable[(player->y) & 0xff]) / 4 + 48 + 16);
  383.             else
  384.                 dy = 64;
  385.             /* 移動方向を設定 */
  386.             SubEnemyMoveToInit (p, dx, dy, SPEED_1, SPEED_1N);
  387.         } else {
  388.             /* 設定値に従って移動 */
  389.             if (SubEnemyMoveTo (p) < 0)
  390.                 p->m_work2 = 0;    /* 移動方向再設定 */
  391.         }
  392.  
  393.  
  394.         /* 翼パーツが消えたら復活までの時間を設定 */
  395.         if ((p->parts1) && (p->parts1->child_death)) {
  396.             p->parts1 = 0;    /* これ以降参照しない */
  397.             p->parts1_work = 90;
  398.         }
  399.         if ((p->parts2) && (p->parts2->child_death)) {
  400.             p->parts2 = 0;    /* これ以降参照しない */
  401.             p->parts2_work = 70;    /* 実は右翼の方が復活が早い */
  402.         }
  403.         /* 翼パーツ発生・復活処理 */
  404.         if (p->parts1_work) {
  405.             if (p->parts1_work == 1)
  406.                 p->parts1 = EnemyInit (ENEMY_LBOSS02W, -80, 0, p->parts1_work2++, p);    /* 左翼 */
  407.             p->parts1_work--;
  408.         }
  409.         if (p->parts2_work) {
  410.             if (p->parts2_work == 1)
  411.                 p->parts2 = EnemyInit (ENEMY_LBOSS02W, 80, 0, p->parts2_work2++, p);    /* 右翼 */
  412.             p->parts2_work--;
  413.         }
  414.         /* 耳を出すか */
  415.         if (p->parts3_work == 0) {
  416.             /* まだ耳が出ていない */
  417.             if (p->parts1_work2 + p->parts2_work2 >= 6) {    /* 翼が出た回数 */
  418.                 p->parts3_work = !0;
  419.                 p->parts3_work2 = 60;
  420.             }
  421.         } else {
  422.             if (p->parts3_work2) {
  423.                 p->parts3_work2--;
  424.                 if (p->parts3_work2 == 1) {
  425.                     p->parts3 = EnemyInit (ENEMY_LBOSS02E, 40, 0, 0, p);    /* 左耳 */
  426.                     p->parts4 = EnemyInit (ENEMY_LBOSS02E, -40, 0, 0, p);    /* 右耳 */
  427.                 }
  428.             } else {
  429.                 /* 耳がまだあるか */
  430.                 if ((p->parts3) && (p->parts3->child_death))
  431.                     p->parts3 = 0;    /* これ以降参照しない */
  432.                 if ((p->parts4) && (p->parts4->child_death))
  433.                     p->parts4 = 0;    /* これ以降参照しない */
  434.                 /* 耳破壊済み */
  435.                 if ((p->parts3 == 0) && (p->parts4 == 0))
  436.                     p->core_info = PALET_CORE_RED | PRIORITY_BOSS_CORE;
  437.             }
  438.         }
  439.  
  440.         /* 次に攻撃処理 */
  441.         switch (p->s_work) {
  442.         case 0:
  443.             if (p->timer > TIMER_3) {
  444.                 p->s_work++;
  445.                 p->s_work2 = 0;
  446.             }
  447.             break;
  448.         case 1:
  449.             if (p->s_work2++ == 10) {
  450.                 EshotInit (ESHOT_NRG23, SHORT_LX - 16, SHORT_LY - 8, SPEED_SHOT4, 149, 0);
  451.                 EshotInit (ESHOT_NRG23, SHORT_LX + 16, SHORT_LY - 8, SPEED_SHOT4, 234, 0);
  452.                 EshotInit (ESHOT_NRG23, SHORT_LX, SHORT_LY + 8, SPEED_SHOT4, 64, 0);
  453.                 EshotInit (ESHOT_NRG23, SHORT_LX - 16, SHORT_LY - 8, SPEED_SHOT4 + 4, 149, 0);
  454.                 EshotInit (ESHOT_NRG23, SHORT_LX + 16, SHORT_LY - 8, SPEED_SHOT4 + 4, 234, 0);
  455.                 EshotInit (ESHOT_NRG23, SHORT_LX, SHORT_LY + 8, SPEED_SHOT4 + 4, 64, 0);
  456.                 EshotInit (ESHOT_NRG23, SHORT_LX - 16, SHORT_LY - 8, SPEED_SHOT4 + 8, 149, 0);
  457.                 EshotInit (ESHOT_NRG23, SHORT_LX + 16, SHORT_LY - 8, SPEED_SHOT4 + 8, 234, 0);
  458.                 EshotInit (ESHOT_NRG23, SHORT_LX, SHORT_LY + 8, SPEED_SHOT4 + 8, 64, 0);
  459.                 SoundSetSE (SE_LASER);    /* 敵ショット音 */
  460.             }
  461.             if (p->s_work2 > 100)
  462.                 p->s_work2 = 0;
  463.             break;
  464.         default:
  465.             break;
  466.         }
  467.  
  468.         /* なぎ倒し弾 */
  469.         if (p->core_info == (PALET_CORE_RED | PRIORITY_BOSS_CORE)) {
  470.             switch (p->s_work3++) {
  471.             case 0:
  472.                 if (p->arg == 0) {
  473.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT5, p->s_angle3, 0);
  474.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT5, p->s_angle3 + 85, 0);
  475.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT5, p->s_angle3 + 170, 0);
  476.                     p->s_angle3 += 12;
  477.                 } else {
  478.                     EshotInit (ESHOT_NRG02, SHORT_LX - 16, SHORT_LY - 8, SPEED_SHOT5, p->s_angle3, 0);
  479.                     EshotInit (ESHOT_NRG02, SHORT_LX - 16, SHORT_LY - 8, SPEED_SHOT5, p->s_angle3 + 85, 0);
  480.                     EshotInit (ESHOT_NRG02, SHORT_LX - 16, SHORT_LY - 8, SPEED_SHOT5, p->s_angle3 + 170, 0);
  481.                     EshotInit (ESHOT_NRG02, SHORT_LX + 16, SHORT_LY - 8, SPEED_SHOT5, p->s_angle3, 0);
  482.                     EshotInit (ESHOT_NRG02, SHORT_LX + 16, SHORT_LY - 8, SPEED_SHOT5, p->s_angle3 + 85, 0);
  483.                     EshotInit (ESHOT_NRG02, SHORT_LX + 16, SHORT_LY - 8, SPEED_SHOT5, p->s_angle3 + 170, 0);
  484.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 8, SPEED_SHOT5, p->s_angle3, 0);
  485.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 8, SPEED_SHOT5, p->s_angle3 + 85, 0);
  486.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY + 8, SPEED_SHOT5, p->s_angle3 + 170, 0);
  487.                     p->s_angle3 += 12;
  488.                 }
  489.                 SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  490.                 break;
  491.             case 12:
  492.                 p->s_work3 = 0;
  493.                 break;
  494.             default:
  495.                 break;
  496.             }
  497.         }
  498.         break;
  499.  
  500.  
  501.         /* 時間切れ撤退 */
  502.     case 5:
  503.         switch (p->m_work) {
  504.         case 0:
  505.             if (SubEnemyMoveTo (p) < 0) {    /* 止まるまで待つ */
  506.                 p->m_work++;
  507.                 SubEnemyMoveToInit (p, 128 + 16, 160, SPEED_3, SPEED_3N);
  508.             }
  509.             break;
  510.         case 1:    /* 一旦中央まで移動してから撤退 */
  511.             if (SubEnemyMoveTo (p) < 0) {    /* 止まるまで待つ */
  512.                 p->m_work++;
  513.                 SubEnemyMoveToInit (p, p->x, -128, SPEED_3, SPEED_3N);
  514.             }
  515.             break;
  516.         case 2:
  517.             if (SubEnemyMoveTo (p) < 0) {    /* 止まるまで待つ */
  518.                 return (-1);    /* 消去 */
  519.             }
  520.             break;
  521.         }
  522.         break;
  523.  
  524.         /* 死んだ */
  525.     case SEQ_DEATH:
  526.         switch (p->m_work) {
  527.         case 0:
  528.             if (SubEnemyMoveToAbort (p) < 0) {    /* 止まるまで待つ */
  529.                 p->m_work++;
  530.                 p->m_work2 = 0;
  531.                 p->m_work3 = 0;
  532.                 /* 当たり判定を無くす */
  533.                 p->hit_px = p->hit_py = p->hit_sx = p->hit_sy = p->hit_cx = 0;
  534.                 if (!eshot_erase)
  535.                     eshot_erase = ESHOT_ERASE;    /* 弾消し */
  536.             }
  537.             break;
  538.         case 1:
  539.             if (p->m_work2++ > 3) {
  540.                 p->m_work2 = 0;
  541.                 p->m_work3++;
  542.                 if (p->m_work3 < 15) {
  543.                     signed short x, y;
  544.                     x = rndtable[(p->timer) & 0xff ^ 0x55] - 128;
  545.                     y = rndtable[(p->timer) & 0xff ^ 0xaa] - 128;
  546.                     /* p->timer は乱数の種として使用しています */
  547.                     EffectInit (EFFECT_EXPL, 0, x / 2 + p->x, y / 4 + p->y);
  548.                     SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  549.                 }
  550.                 if (p->m_work3 > 20) {
  551.                     short h;
  552.                     for (h = 0; h < 6; h++) {
  553.                         EffectInit (EFFECT_EXPL, 0,
  554.                                 (signed short) ((rndtable[h] - 128) / 2) + p->x,
  555.                                 (signed short) ((rndtable[h + 1] - 128) / 4) + p->y + 16);
  556.                     }
  557.                     SoundSetSE (SE_EXPL_L);    /* ボスキャラ爆発音 */
  558.                     if (p->core_info == (PALET_CORE_RED | PRIORITY_BOSS_CORE))
  559.                         EffectInit (EFFECT_POINTS_RED, POINTS_15000, p->x, p->y);
  560.                     else
  561.                         EffectInit (EFFECT_POINTS_BLUE, POINTS_7000, p->x, p->y);
  562.                     EffectInit (EFFECT_HAHEN, 0, p->x, p->y);
  563.  
  564.                     return (-1);    /* 消去 */
  565.                 }
  566.             }
  567.             break;
  568.         }
  569.         break;
  570.     default:
  571.         break;
  572.     }
  573.     /* 画面外に出たら消去 */
  574.     if (SHORT_LY > 256 + 32)
  575.         return (-1);    /* 消去 */
  576.  
  577.  
  578.     /* 自機ショットに当たった時の処理 */
  579.     if (p->damage) {
  580.         if (p->damage_core) {
  581.             p->info = PALET_RED | PRIORITY_BOSS;
  582.             p->damage_core = 0;
  583.         } else {
  584.             p->info = PALET_DAMAGE | PRIORITY_BOSS;
  585.         }
  586.         if ((p->hp -= p->damage) <= 0) {
  587.             /* 死んだ */
  588.             p->seq = SEQ_DEATH;
  589.             p->m_work = 0;
  590.         }
  591.         p->damage = 0;
  592.         p->flash = TIMER_FLASH_DAMAGE;
  593.     } else {
  594.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 300)) {
  595.             p->info = PALET_RED | PRIORITY_BOSS;
  596.             if (p->flash > TIMER_FLASH_NORMAL)
  597.                 p->flash = 0;
  598.         } else {
  599.             p->info = p->work4;
  600.         }
  601.     }
  602.  
  603.     xobj_set_st (p);
  604.  
  605.     /* コアの表示 */
  606.     p->core_x = p->x - 8;    /* コアの中心は (-8,-8) ドットずれる */
  607.     p->core_y = p->y;
  608.     xsp_set_st (&(p->core_x));
  609.     if (p->seq >= 4) {
  610.         /* 第2形態以降なら2つ目、3つ目のコアを表示 */
  611.         p->core_x = p->x - 16;
  612.         p->core_y = p->y - 16;
  613.         xsp_set_st (&(p->core_x));
  614.         p->core_x = p->x;
  615.         p->core_y = p->y - 16;
  616.         xsp_set_st (&(p->core_x));
  617.     }
  618.     return (0);
  619. }
  620.  
  621.  
  622.  
  623. static void EnemyTiniLBoss02 (ENEMY * p)
  624. {
  625.     /* パーツが存在していたら消すように指示 */
  626.     if (p->parts1)
  627.         p->parts1->child_kill = !0;
  628.     if (p->parts2)
  629.         p->parts2->child_kill = !0;
  630.     if (p->parts3)
  631.         p->parts3->child_kill = !0;
  632.     if (p->parts4)
  633.         p->parts4->child_kill = !0;
  634.     entry_counter_stop = 0;    /* エントリーカウンター停止解除 */
  635. }
  636.